import {options} from "../Global";
import {PixelRatio} from "react-native";
import {setSpText2} from "./ScreenUtil";

/**
 * 数组翻转
 * @param arr
 * @returns {[]}
 */
exports.reverse = function reverse(arr) {
    let newArr = [];
    for (let i in arr) {
        let c = arr[arr.length - i - 1];
        newArr.push(c);
    }
    return newArr;
};

/**
 * 替换文字
 * @param text 原始文字
 * @param oldStr 被替换的文字
 * @param newStr 新的文字
 * @returns {*}
 */
exports.replace = (text, oldStr, newStr) => {
    while (text.indexOf(oldStr) >= 0) {
        // text = text.replace(oldStr, '{"\\n"}');
        text = text.replace(oldStr, newStr);
    }
    return text;
};

/**
 * 中文排序
 * http://www.cnblogs.com/weblff/p/9051608.html
 * @param arr
 * @param dataLeven
 */
exports.sortChinese = function sortChinese(arr, dataLeven) { // 参数：arr 排序的数组; dataLeven 数组内的需要比较的元素属性
    /* 获取数组元素内需要比较的值 */
    function getValue(option) { // 参数： option 数组元素
        if (!dataLeven)
            return option;
        var data = option;
        dataLeven.split('.').filter(function (item) {
            data = data[item];
        });
        return data + '';
    }

    arr.sort(function (item1, item2) {
        return getValue(item1).localeCompare(getValue(item2), 'zh-CN');
        // iOS 与 Android 使用 localeCompare 表现形式不同
        // if (Platform.OS === 'ios') {
        //     return getValue(item1).localeCompare(getValue(item2), 'zh-CN');
        // } else {
        //     return getValue(item2).localeCompare(getValue(item1), 'zh-CN');
        // }
    })
};

/**
 * GBK编码问题
 * https://blog.ihanai.com/2019/03/22/fetch-parse-response-in-gbk/
 * https://segmentfault.com/q/1010000004338890
 * @param blob
 * @param encoding
 * @returns {Promise<R>}
 */
exports.readBlobAsText = (blob, encoding) => {
    return new Promise((resolve, reject) => {
        const fr = new FileReader();
        fr.onload = event => {
            resolve(fr.result);
        };

        fr.onerror = err => {
            reject(err);
        };

        fr.readAsText(blob, encoding);
    });
};

/**
 * cheerio的map函数返回的不是标准数组形式，这里重新转一下
 * @param oldArray
 * @returns {[]}
 */
exports.toArray = (oldArray) => {
    let arr = [];
    for (let i = 0; i < oldArray.length; i++) {
        arr.push(oldArray[i]);
    }
    return arr;
};

const linePaddingLeft = 15;//每行左边距
const linePaddingRight = 15;//每行右边距
const titleHeight = 20;//顶部显示标题的高度
const pageNumberHeight = 20;//底部显示页码的高度
// const fontSize = options.readerSettings.fontSize;//字体大小
// const lineHeight = options.readerSettings.lineHeight;//每行的行高

exports.handleContent = (content, _fontSize, _lineHeight) => {
    // 1.不间断空格\u00A0，主要用在office中，让一个单词在结尾处不会换行显示，快捷键ctrl+shift+space；
    // 2.半角空格(英文符号)\u0020,代码中常用的；
    // 3.全角空格(中文符号)\u3000,中文文章中使用；
    let tmp = '\u3000\u3000' + content.replace(/\n/g, '\n\u3000\u3000');
    let fontSize = setSpText2(_fontSize),
        lineHeight = setSpText2(_lineHeight);

    // width要去掉renderLine里面左右的padding
    // height要去掉上下边的文字信息
    let textAreaWidth = options.window.width - linePaddingLeft,//正文显示区域的宽度
        textAreaHeight = options.window.height - pageNumberHeight - titleHeight - 5 - 5;//正文显示区域的高度
    let count = parseInt(textAreaWidth / fontSize) - 1;
    let lines = parseInt(textAreaHeight / lineHeight) - 1;
    let length = tmp.length;
    // console.log('内容长度:' + length);
    // console.log('每页显示多少行:' + lines);
    // console.log('每行显示多个字:' + count);

    // 一维数组，每行内容
    let array = [];
    let x = 0, y;
    while (x < length) {
        let str = tmp.substring(x, x + count);
        let s;
        if (str.indexOf('\n') !== -1) {
            // 找到换行符
            y = x + str.indexOf('\n') + 1;
            s = tmp.substring(x, y).replace('\n', '');
        } else {
            // 没找到换行符
            y = x + count;
            s = tmp.substring(x, y);
        }
        x = y;
        if (s !== '' && s !== '\u3000\u3000') {
            array.push(s);
        }
    }
    // 转成二维数组array[页码][每页内容]
    let pagingData = [];
    let totalPage = Math.ceil(array.length / lines);
    for (let i = 0; i < totalPage; i++) {
        let eachPage = [];
        for (let j = 0; j < lines; j++) {
            let k = i * lines + j;
            eachPage.push(array[k]);
        }
        pagingData[i] = eachPage;
    }
    return pagingData;
};